home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / bin / check-missing-firmware < prev    next >
Text File  |  2009-10-28  |  3KB  |  134 lines

  1. #!/bin/sh
  2. set -e
  3. . /usr/share/debconf/confmodule
  4.  
  5. LOG=/tmp/missing-firmware
  6. DENIED=/tmp/missing-firmware-denied
  7. NL="
  8. "
  9.  
  10. log () {
  11.     logger -t check-missing-firmware "$@"
  12. }
  13.  
  14. read_log () {
  15.     # Give modules some time to request firmware.
  16.     sleep 1
  17.     
  18.     modules=""
  19.     files=""
  20.     if [ -s "$LOG" ]; then
  21.         mv $LOG $LOG.old
  22.         OLDIFS="$IFS"
  23.         IFS="$NL"
  24.         for line in $(sort $LOG.old | uniq); do
  25.             module="${line%% *}"
  26.             file="${line#* }"
  27.             [ -z "$module" ] || [ -z "$file" ] && continue
  28.  
  29.             if grep -q "^$file$" $DENIED 2>/dev/null; then
  30.                 continue
  31.             fi
  32.  
  33.             modules="$module${modules:+ $modules}"
  34.             files="$file${files:+ $files}"
  35.         done
  36.         IFS="$OLDIFS"
  37.         rm -f $LOG.old
  38.     fi
  39.  
  40.     if [ -n "$modules" ]; then
  41.         log "missing firmware files ($files) for $modules"
  42.         return 0
  43.     else
  44.         log "no missing firmware in $LOG"
  45.         return 1
  46.     fi
  47. }
  48.  
  49. first=1
  50. ask_load_firmware () {
  51.     db_subst hw-detect/load_firmware FILES "$files"
  52.     if ! db_input high hw-detect/load_firmware; then
  53.         if [ ! "$first" ]; then
  54.             exit 1;
  55.         else
  56.             first=""
  57.         fi
  58.     fi
  59.     if ! db_go; then
  60.         exit 10 # back up
  61.     fi
  62.     db_get hw-detect/load_firmware
  63.     if [ "$RET" = true ]; then
  64.         return 0
  65.     else
  66.         echo "$files" | tr ' ' '\n' >> $DENIED
  67.         return 1
  68.     fi
  69. }
  70.  
  71. list_deb_firmware () {
  72.     ar p "$1" data.tar.gz | tar zt \
  73.         | grep '^\./lib/firmware/' \
  74.         | sed -e 's!^\./lib/firmware/!!' \
  75.         | grep -v '^$'
  76. }
  77.  
  78. check_deb_arch () {
  79.     arch=$(ar p "$1" control.tar.gz | tar zxO ./control | grep '^Architecture:' | sed -e 's/Architecture: *//')
  80.     [ "$arch" = all ] || [ "$arch" = "$(udpkg --print-architecture)" ]
  81. }
  82.  
  83. install_firmware_pkg () {
  84.     if echo "$1" | grep -q '\.deb$'; then
  85.         # cache deb for installation into /target later
  86.         mkdir -p /var/cache/firmware/
  87.         cp -a "$1" /var/cache/firmware/ || true
  88.         udpkg --unpack "/var/cache/firmware/$(basename "$1")"
  89.     else
  90.         udpkg --unpack "$1"
  91.     fi
  92. }
  93.  
  94. while read_log && ask_load_firmware; do
  95.     # first, look for loose firmware files on the media.
  96.     if mountmedia; then
  97.         for file in $files; do
  98.             for f in "/media/$file" "/media/firmware/$file"; do
  99.                 if [ -e "$f" ]; then
  100.                     log "copying loose file $file"
  101.                     mkdir -p /lib/firmware
  102.                     rm -f "/lib/firmware/$file"
  103.                     cp -a "$f" /lib/firmware/ || true
  104.                     break
  105.                 fi
  106.             done
  107.         done
  108.         umount /media || true
  109.     fi
  110.  
  111.     # Try to load udebs (or debs) that contain the missing firmware.
  112.     # This does not use anna because debs can have arbitrary
  113.     # dependencies, which anna might try to install.
  114.     if mountmedia driver; then
  115.         echo "$files" | sed -e 's/ /\n/g' >/tmp/grepfor
  116.         for filename in /media/*.deb /media/*.udeb /media/*.ude /media/firmware/*.deb /media/firmware/*.udeb /media/firmware/*.ude; do
  117.             if [ -f "$filename" ]; then
  118.                 if check_deb_arch "$filename" && list_deb_firmware "$filename" | grep -qf /tmp/grepfor; then
  119.                     log "installing firmware package $filename"
  120.                     install_firmware_pkg "$filename" || true
  121.                 fi
  122.             fi
  123.         done
  124.         rm -f /tmp/grepfor
  125.         umount /media || true
  126.     fi
  127.  
  128.     # remove and reload modules so they see the new firmware
  129.     for module in $modules; do
  130.         modprobe -r $module || true
  131.         modprobe $module || true
  132.     done
  133. done
  134.